www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第19章 回归分析/reglm.m

    function stats = reglm(y,X,model,varnames)
% 多重线性回归分析或广义线性回归分析
%
%   reglm(y,X),产生线性回归分析的方差分析表和参数估计结果,并以表格形式显示在屏幕上. 参
%   数X是自变量观测值矩阵,它是n行p列的矩阵. y是因变量观测值向量,它是n行1列的列向量.
%
%   stats = reglm(y,X),还返回一个包括了回归分析的所有诊断统计量的结构体变量stats.
%
%   stats = reglm(y,X,model),用可选的model参数来控制回归模型的类型. model是一个字符串,
%   其可用的字符串如下
%       'linear'          带有常数项的线性模型(默认情况)
%       'interaction'     带有常数项、线性项和交叉项的模型
%       'quadratic'       带有常数项、线性项、交叉项和平方项的模型
%       'purequadratic'   带有常数项、线性项和平方项的模型
%
%   stats = reglm(y,X,model,varnames),用可选的varnames参数指定变量标签. varnames
%   可以是字符矩阵或字符串元胞数组,它的每行的字符或每个元胞的字符串是一个变量的标签,它的行
%   数或元胞数应与X的列数相同. 默认情况下,用X1,X2,…作为变量标签.
%
%   例:
%   x = [215 250 180 250 180 215 180 215 250 215 215
%       136.5 136.5 136.5 138.5 139.5 138.5 140.5 140.5 140.5 138.5 138.5]';
%   y = [6.2 7.5 4.8 5.1 4.6 4.6 2.8 3.1 4.3 4.9 4.1]';
%   reglm(y,x,'quadratic')
%
%   ------------------------------------方差分析表------------------------------------
%   方差来源    自由度            平方和             均方             F值          p值
%   回归       5.0000          15.0277           3.0055          7.6122      0.0219
%   残差       5.0000           1.9742           0.3948
%   总计      10.0000          17.0018
%
%         均方根误差(Root MSE)     0.6284             判定系数(R-Square)    0.8839
%   因变量均值(Dependent Mean)     4.7273        调整的判定系数(Adj R-Sq)    0.7678
%
%   -----------------------------------参数估计-----------------------------------
%      变量               估计值            标准误             t值          p值
%     常数项             30.9428        2011.1117           0.0154      0.9883
%        X1              0.7040           0.6405           1.0992      0.3218
%        X2             -0.8487          29.1537          -0.0291      0.9779
%     X1*X2             -0.0058           0.0044          -1.3132      0.2461
%     X1*X1              0.0003           0.0003           0.8384      0.4400
%     X2*X2              0.0052           0.1055           0.0492      0.9626
%
%   Copyright 2009 - 2010 xiezhh. 
%   $Revision: 1.0.0.0 $  $Date: 2009/12/22 21:41:00 $

if nargin < 2
   error('至少需要两个输入参数');
end
p = size(X,2);    % X的列数,即变量个数
if nargin < 3 || isempty(model)
   model = 'linear';    % model参数的默认值
end

% 生成变量标签varnames
if nargin < 4 || isempty(varnames)
    varname1 = strcat({'X'},num2str([1:p]'));
    varnames = makevarnames(varname1,model);    % 默认的变量标签
else
    if ischar(varnames)
        varname1 = cellstr(varnames);
    elseif iscell(varnames)
        varname1 = varnames(:);
    else
        error('varnames 必须是字符矩阵或字符串元胞数组');
    end
    if size(varname1,1) ~= p
        error('变量标签数与X的列数不一致');
    else
        varnames = makevarnames(varname1,model);    % 指定的变量标签
    end
end

ST = regstats(y,X,model);    % 调用regstats函数进行线性回归分析,返回结构体变量ST
f = ST.fstat;    % F检验相关结果
t = ST.tstat;    % t检验相关结果

% 显示方差分析表
fprintf('\n');
fprintf('------------------------------------方差分析表------------------------------------');
fprintf('\n');
fprintf('%s%7s%15s%15s%15s%12s','方差来源','自由度','平方和','均方','F值','p值');
fprintf('\n');
fmt = '%s%13.4f%17.4f%17.4f%16.4f%12.4f';
fprintf(fmt,'回归',f.dfr,f.ssr,f.ssr/f.dfr,f.f,f.pval);
fprintf('\n');
fmt = '%s%13.4f%17.4f%17.4f';
fprintf(fmt,'残差',f.dfe,f.sse,f.sse/f.dfe);
fprintf('\n');
fmt = '%s%13.4f%17.4f';
fprintf(fmt,'总计',f.dfe+f.dfr,f.sse+f.ssr);
fprintf('\n');
fprintf('\n');

% 显示判定系数等统计量
fmt = '%22s%15.4f%25s%10.4f';
fprintf(fmt,'均方根误差(Root MSE)',sqrt(ST.mse),'判定系数(R-Square)',ST.rsquare);
fprintf('\n');
fprintf(fmt,'因变量均值(Dependent Mean)',mean(y),'调整的判定系数(Adj R-Sq)',ST.adjrsquare);
fprintf('\n');
fprintf('\n');

% 显示参数估计及t检验相关结果
fprintf('-----------------------------------参数估计-----------------------------------');
fprintf('\n');
fprintf('%8s%18s%15s%15s%12s','变量','估计值','标准误','t值','p值');
fprintf('\n');
for i = 1:size(t.beta,1)
    if i == 1
        fmt = '%8s%20.4f%17.4f%17.4f%12.4f\n';
        fprintf(fmt,'常数项',t.beta(i),t.se(i),t.t(i),t.pval(i));
    else
        fmt = '%10s%20.4f%17.4f%17.4f%12.4f\n';
        fprintf(fmt,varnames{i-1},t.beta(i),t.se(i),t.t(i),t.pval(i));
    end
end

if nargout == 1
    stats = ST;    % 返回一个包括了回归分析的所有诊断统计量的结构体变量
end

% -----------------子函数-----------------------
function varnames = makevarnames(varname1,model)
% 生成指定模型的变量标签
p = size(varname1,1);
varname2 = [];
for i = 1:p-1
    varname2 = [varname2;strcat(varname1(i),'*',varname1(i+1:end))];
end
varname3 = strcat(varname1,'*',varname1);
switch model
    case 'linear'
        varnames = varname1;
    case 'interaction'
        varnames = [varname1;varname2];
    case 'quadratic'
        varnames = [varname1;varname2;varname3];
    case 'purequadratic'
        varnames = [varname1;varname3];
end